package com.内部类.匿名内部类;

public class AnonymousInnerClass {
    // 基于接口的匿名内部类
    // 匿名Anonymous内部Inner类Class
    /**
     * 1.本质还是类，只是没有名字；
     * 2.内部类
     * 3.匿名内部类还是一个对象；
     * 4.基本语法： new 类/接口(参数列表){  类体   }
     *  */
    public static void main(String[] args) {
        new Outer().method();
        //创建外部类Outer对象，调用方法method()，在method()方法中创建了匿名内部类，并调用了cry()方法
    }
}

class Outer {
    private int num = 10;
    public void method(){
        /***
         * 匿名内部类：
         * 1.需求：想使用IA接口，并创建对象；
         * 2.传统方法：编写一个类，实现接口，并创建对象； 如果我们把这个类只使用一次 就会导致浪费内存；
         * 4.可以用匿名内部类简化开发；
         */
        IA tiger = new IA(){
            int n = 0;//这不是实例化接口  而是  一步定义匿名内部类的同时直接让tiger指向匿名内部类
            @Override
            public void cry() {
                System.out.println("老虎叫唤");
            }
        };
        tiger.cry();
        System.out.println(tiger.n);  //1,因为 tiger的编译类型是 IA接口，属性没有动态绑定，在那里定义就用那里的
        /**tiger的编译类型是 IA接口
         * 但 tiger的运行类型是匿名内部类（系统自动分配的）  ==》Outer$1；
         *IA tiger = new IA() 是怎么简化进行的：
         *  1.这一步相当于定义一个匿名内部类Outer$1，匿名内部类是实现了接口IA的方法；
         * class Outer$1 implements IA{
         *     public void cry(){
         *         System.out.println("老虎叫唤");
         *     }
         * }
         * 2.new了Outer$1这个匿名内部类；
         * 让接口类型的引用指向这个匿名内部类Outer$1，并调用了cry()方法；
         */


    }
}
interface IA  {
    int n=1;
    public void cry();
}

